package com.example.bootdemo.linkedlist1;



public class SingleLinkedListDemo1 {


    public static void main(String[] args) {
        //进行测试
        //先创建节点
        HeroNode1 hero1 = new HeroNode1(1, "宋江", "及时雨");
        HeroNode1 hero2 = new HeroNode1(2, "卢俊义", "玉麒麟");
        HeroNode1 hero3 = new HeroNode1(3, "吴用", "智多星");
        HeroNode1 hero4 = new HeroNode1(4, "林冲", "豹子头");

        //创建要给链表
        SingleLinkedList1 singleLinkedList = new SingleLinkedList1();


        //加入
//        singleLinkedList.add(hero1);
//        singleLinkedList.add(hero4);
//        singleLinkedList.add(hero2);
//        singleLinkedList.add(hero3);

        // 测试一下单链表的反转功能
        //  System.out.println("原来链表的情况~~");
        // singleLinkedList.list();

//		System.out.println("反转单链表~~");
//		reversetList(singleLinkedList.getHead());
//		singleLinkedList.list();

//        System.out.println("测试逆序打印单链表, 没有改变链表的结构~~");
//        reversePrint(singleLinkedList.getHead());


		//加入按照编号的顺序
		singleLinkedList.addByOrder(hero1);
		singleLinkedList.addByOrder(hero4);
		singleLinkedList.addByOrder(hero2);
		singleLinkedList.addByOrder(hero3);

		//显示一把
		singleLinkedList.list();
        //删除一个节点
        singleLinkedList.del(3);
/*
		//测试修改节点的代码
		HeroNode newHeroNode = new HeroNode(2, "小卢", "玉麒麟~~");
		singleLinkedList.update(newHeroNode);

		System.out.println("修改后的链表情况~~");
		singleLinkedList.list();

		//删除一个节点
		singleLinkedList.del(1);
		singleLinkedList.del(4);
		System.out.println("删除后的链表情况~~");
		singleLinkedList.list();

		//测试一下 求单链表中有效节点的个数
		System.out.println("有效的节点个数=" + getLength(singleLinkedList.getHead()));//2

		//测试一下看看是否得到了倒数第K个节点
		HeroNode res = findLastIndexNode(singleLinkedList.getHead(), 3);
		System.out.println("res=" + res);
*/


    }
}

    //定义SingleLinkedList 管理我们的英雄
    class SingleLinkedList1 {
        private final HeroNode1 head = new HeroNode1(0, "", "");

        public HeroNode1 getHead() {
            return head;
        }

        //添加节点到单向链表
        //思路，当不考虑编号顺序时
        //1. 找到当前链表的最后节点
        //2. 将最后这个节点的next 指向 新的节点
        public void add(HeroNode1 heroNode) {
            //因为head节点不能动，因此我们需要一个辅助遍历 temp
            HeroNode1 temp = head;
            while (true){
                if (temp.next==null){
                    break;
                }
                temp=temp.next;
            }
            temp.next=heroNode;
            System.out.println(head);
        }

        public void addByOrder(HeroNode1 heroNode) {
            //因为head节点不能动，因此我们需要一个辅助遍历 temp
            boolean flag = false; // flag标志添加的编号是否存在，默认为false
            HeroNode1 temp = head;
            while (true){
                if (temp.next==null){
                    break;
                }
                if (temp.next.no>heroNode.no){

                    break;
                }else if(temp.next.no==heroNode.no){
                    flag=true;
                    break;
                }
                temp=temp.next;
            }
            if (flag){
                System.out.println("已存在");
            }else {
                HeroNode1 temp1=temp.next;
                heroNode.next=temp1;
                temp.next=heroNode;
                //System.out.println(head);
            }
        }

        //显示链表[遍历]
        public void list() {
            HeroNode1 heroNode1=   head.next;
            if (heroNode1==null){
                System.out.println("链表为空");
            }
            while (true){
                if (heroNode1==null){
                    break;
                }
                System.out.println(heroNode1);
                heroNode1=heroNode1.next;

            }
        }

        //删除节点
        //思路
        //1. head 不能动，因此我们需要一个temp辅助节点找到待删除节点的前一个节点
        //2. 说明我们在比较时，是temp.next.no 和  需要删除的节点的no比较
        public void del(int no) {
            boolean flag = false; // flag标志添加的编号是否存在，默认为false
            HeroNode1 temp = head;

            while (true){
                if (temp.next==null){
                    break;
                }
               if(temp.next.no==no){
                    flag=true;
                    break;
                }
                temp=temp.next;
            }
            if (flag){
                HeroNode1 heroNode1=temp.next.next;
                temp.next=heroNode1;
                System.out.println(temp);
                System.out.println(head);
            }else {

                System.out.println("不存在");
            }
        }

    }




    //定义HeroNode ， 每个HeroNode 对象就是一个节点
    class HeroNode1 {
        public int no;
        public String name;
        public String nickname;
        public HeroNode1 next; //指向下一个节点
        //构造器
        public HeroNode1(int no, String name, String nickname) {
            this.no = no;
            this.name = name;
            this.nickname = nickname;
        }
        //为了显示方法，我们重新toString
        @Override
        public String toString() {
            return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + ", next=" + next + "]";
        }

    }

